package br.com.limaogames.framework.facebook;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.os.Bundle;
import android.widget.Toast;

import com.facebook.AccessToken;
import com.facebook.AccessTokenSource;
import com.facebook.FacebookException;
import com.facebook.FacebookRequestError;
import com.facebook.Session;
import com.facebook.Session.StatusCallback;
import com.facebook.widget.WebDialog;
import com.facebook.widget.WebDialog.Builder;
import com.facebook.widget.WebDialog.OnCompleteListener;

public class FacebookDAO implements OnCompleteListener {

	private Context context;

	private StatusCallback statusCallback;
	
	private String permissions;

	public FacebookDAO() {
		super();
	}

	/**
	 * Construtor.
	 * 
	 * @param context - Contexto da aplicacao.
	 * @param statusCallback - Listener para retornar o callback da requisicao ao facebook.
	 * @param permissions - String com as permissoes que serao necessarias para acessar a conta do facebook do usuario. As permissoes devem estar separadas por virgula.
	 */
	public FacebookDAO(Context context, StatusCallback statusCallback, String permissions) {
		super();
		this.context = context;
		this.statusCallback = statusCallback;
		this.permissions	= permissions;
	}

	/**
	 * M�todo para realizar o login no facebook.
	 * 
	 * @param context - Contexto da aplicacao.
	 * @param statusCallback - Listener para retornar o callback da requisicao ao facebook.
	 * @param fbId - String identificador da aplicacao no facebook. Esse identificador e encontrado na pagina da aplicacao no facebook.
	 */
	public void login(Context context, StatusCallback statusCallback, String fbId) {
		Bundle parameters = new Bundle();
		parameters.putString("response_type", "code");
		parameters.putString("scope", permissions);
		Builder webDialog = new Builder(context, fbId, "oauth", parameters);
		WebDialog dialog = webDialog.build();
		dialog.setOnCompleteListener(new FacebookDAO(context, statusCallback, fbId));
		dialog.show();
	}

	/**
	 * Mostra um {@link Toast} informando o usuario do erro causado pela requisicao.
	 * 
	 * @param context - Contexto da aplicacao.
	 * @param error - Objeto de {@link FacebookRequestError} com o erro ocorrido.
	 */
	public void handleRequestError(Context context,
			FacebookRequestError error) {
		String message = "";
		switch (error.getErrorCode()) {
		case 506:
			message = "Por favor utilizar parametros diferentes. Nao e permitido spam.";
			break;

		default:
			message = error.getErrorMessage();
			break;
		}
		Toast toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
		toast.show();
	}

	@Override
	public void onComplete(Bundle values, FacebookException error) {
		if (values != null) {

			List<String> permissoes = new ArrayList<String>();
			for (String permissao : permissions.split(",")) {
				permissoes.add(permissao);
			}
			Session.openActiveSessionWithAccessToken(context, AccessToken
					.createFromExistingAccessToken(
							values.getString("access_token"), null, null,
							AccessTokenSource.WEB_VIEW, permissoes),
					statusCallback);
		}
	}

}
